package com.niit.mobileDevide.ToHDFS;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;

public class hdfsClinet {
    private FileSystem fs = null;

    /*
     Junit:是用来做Java测试 工具包
        @Before:是在@Test之前执行的，一般用来做相应的配置和准备工作

        @Test：类似于我们main方法，是运行逻辑代码的

        @After：是在@Test之后执行的，一般用来关闭、释放内存等操作
     */
    @Before  //Alt+ enter
    public void connect2HDFS() throws IOException {
        //用来在HDFS连接的方法
        //1. 设置连接客户都的身份 root
        System.setProperty("HADOOP_USER_NAME","root");

        //2.创建连接的配置对象实例
        Configuration conf = new Configuration();


        //3.设置指定的操作文件系统
        conf.set("fs.defaultFS","hdfs://192.168.88.134:8020");

        //4.创建文件系统对象  有点小陷阱
        fs = FileSystem.get(conf);

    }

    //1.创建文件夹
    @Test   // @Test不能有参数列表
    public void mkdir() throws IOException {
        //1.创建目录的路径
        Path path = new Path("/new_BD2");
        //2.使用文件系统对象去创建
        fs.mkdirs(path);
    }

    //2.上传文件
    @Test
    public void putFile() throws IOException {
        //上传文件的本地路径
        Path src = new Path("E:\\YANG.csv");

        //上传文件的目标路径 HDFS的路径
        Path dst = new Path("/new_BD2");

        //执行上传
        fs.copyFromLocalFile(src,dst);
    }

    //下载文件
    @Test
    public void getFile() throws IOException {
        //下载的文件路径 HDFS路径
        Path src = new Path("/new_BD2/YANG.csv");

        //下载的目标路径 本地路径
        Path dst = new Path("E:\\");

        //执行下载
        fs.copyToLocalFile(src,dst);
    }

    //创建文件并写入数据
    @Test
    public void creatFile() throws IOException {
        //创建文件的路径
        Path path = new Path("/new_BD2/bd2.txt");
        //数据输出流 用于写入文件内容
        FSDataOutputStream outputStream = fs.create(path);
        outputStream.write("hello Hadoop".getBytes());
        outputStream.close();
    }

    //读取文件
    @Test
    public void readFile() throws IOException {
        //创建文件的路径
        Path path = new Path("/new_BD2/bd2.txt");
        //数据输入流 用于读取文件内容
        FSDataInputStream open = fs.open(path);
        byte[] bytes = new byte[1024];
        int len = 0;
        while ( (len = open.read(bytes)) != -1   ){

            String res = new String(bytes,0,len);
            System.out.println(res);
        }
    }

    //删除文件
    @Test
    public void deleteFile() throws IOException {
        //要删除文件的路径
        Path path = new Path("/new_BD2/bd2.txt");
        fs.delete(path,false);
    }



    @After
    public void close() throws IOException {
        if(fs !=null){
            fs.close();
        }
    }

}
